如何获得更小的应用文件尺寸?来了解下 Android App Bundle
对于手机用户来说,“存储空间不足” 警告有时会显得非常烦人。时至今日,手机存储容量仍然是有限的。虽然存储容量多年来一直在增长,但是填充在我们手机里的东西:音乐、应用、游戏、照片等也同样在增长。
如何针对不同的用户给出最优的安装体验,正是 Android App Bundle 所要解决的问题。本文将阐述 App Bundle 可以带来的好处,并演示如何使用这种全新的分发功能。
传统的 Android Package Kit (APK) 包含应用支持的所有设备的代码和资源 (布局文件、图像等)。因此,您在安装 APK 时可能装上了一些您永远不会用到的资源。您的屏幕尺寸不会改变,您的 CPU 也不会; 您通常不会说应用所支持的所有语言。很明显,APK 里的内容的比您要求的更多,占用的空间也比实际需要的更多。
如果因为上述原因带来的臃肿的 APK 让您颇为困扰,现在解决方案就在眼前 —— 今年在谷歌 I/O 上发布的 Android App Bundle,可以帮助开发者用更小尺寸的 APK 交付出同样卓越的应用。下面,我们将解释 Android App Bundles 可以为您提供何种帮助,并演示其使用方式。
Android App Bundle 是什么?
Android App Bundle 是一种发布格式 —— 精确地说,是一个带有 .aab 扩展名的 zip 文件。它包含应用支持的所有设备的代码和资源,例如 DEX 文件、本地代码库、清单文件、各种资源文件等。一旦上传用于发布,Google Play 就会处理 APK 的签名和生成,这个过程称为动态交付 (Dynamic Delivery)。动态交付的用途是,根据用户的设备配置为用户生成优化的 APK。那么这究竟是怎么做到的?
分拆 APK (在 Lollipop 中引入) 是从给定的 Android App Bundle 生成的,其行为与单个 APK 无异。一个典型的应用可以获得一个基础 APK 和多个配置 APK。而且,如果应用具有动态功能,用户也可以获得动态功能 APK 及其配置 APK。基本 APK 包含所有设备配置共有的文件,如清单文件。配置 APK 是为您生成的,每个之中都包含有特定设备配置的相关资源:语言、CPU 架构或屏幕像素密度。因此,用户将获得标准的基本 APK (与所有其他设备一样) 以及仅包含用户设备相关资源的配置 APK。
这意味着,如果我使用的是一台 Android One 手机 (小米 A1) 而且我设置的主要语言是英文,则这台手机将获得基础 APK 以及支持英文、arm64 CPU 架构和 xhdpi 屏幕分辨率的配置 APK。更棒的是,当设备配置 (如语言) 发生变化时,Google Play 会检测到它,并下载该语言的配置 APK。为了进一步降低 APK 大小,我们正计划推出基于纹理压缩格式、图形 API 和新平台功能的分发方案。
动态功能 APK 包含用户首次安装应用时不需要的应用功能代码和资源。开发者可以把这些用途或功能添加到他们的应用中,Google Play 会按需提供这些动态功能模块,而不是在安装时统一添加,从而进一步减少应用下载体积。这也很好理解:我们有必要将那些消耗空间且在安装时根本用不着的功能,以及那些很少用得着的功能,都打包进动态功能模块中,这将显著减少用户安装时的文件下载量。
安装早于 Android Lollipop 版本的设备也可以享受安装文件体积缩小的福利,但其 APK 中将包含所有语言。
在如今,很显然构建一个统一的臃肿的 APK 的做法已经过时了。Android App Bundle 代表着 Android 应用交付的未来,接下来我们就可以看到如何构建这样的一个安装包。
Android App Bundle != APK
Android App Bundle 与 APK 有一些相似之处,但它们是截然不同的,且用于不同的目的。首先,App Bundle (应用束)纯粹是为了上传设计的文件,用户无法直接安装和使用它。它是一个 zip 文件,Google Play 从中生成优化的 APK 并将其提供给设备进行安装。应用束包含用于帮助工具生成 APK 的元数据文件 (这些元数据文件最终不会出现在 APK 中)。此外,应用束拥有严格的验证标准。
从 APK 切换到应用束是一个无缝过程。如果您使用 Android Studio 3.2 及更高版本,那么您只需点击几下即可生成已签名的应用束,将其上传到 Play Store,即可让用户开始享受更小尺寸 APK 所带来的便利。由于您的代码库没有重大变化,因此您无需担心会有什么问题发生。Android App Bundle 的早期采用者已经发现,动态交付显著减小了他们的应用体积。一些开发者甚至可以将他们的 APK 大小减半。
△ 一些知名 app 使用 App Bundle 减小应用体积的数据
Android App Bundle 的好处都有哪些?
Android App Bundle 为应用开发者和用户带来了诸多好处。这里我们来看看其中的几条:
较小的应用意味着更多用户可以安装您的应用,而无需考虑删除什么以腾出空间。
较小的应用意味着用户不太可能卸载您的应用以在其设备上腾出空间。
Android App Bundle 是单一工件,因此无需构建、签名或管理多个 APK。
您可以为特定用例和受众添加动态功能,而无需增加安装时的应用体积。
这个列表还会越来越长,许多有趣的功能很快就会提供给开发者,例如应用束即将支持免安装应用。
构建 App Bundle
大多数应用项目都不需要花费太多精力来构建支持动态交付的应用束。实际上,如果您已根据既定惯例组织应用代码和资源,只需在 Android Studio 中点击几下,就可以构建已签名的 Android 应用束。但首先,我们需要获得 Android Studio Canary。另外值得注意的是 Android Studio 3.2 稳定版最近已经发布。
>> 获得 3.2 版本的 Android Studio:
https://developer.android.google.cn/studio/
在 Android Studio 中打开项目后,转到菜单栏并选择 Build > Build Bundle(s)/ APKs > Build Bundle(s)。等待生成应用束。您可以在生成应用束后的弹出窗口中点击选项来找到生成的 .aab 文件,并进行分析。
△ 通过菜单构建 App Bundle
△ 构建完成后可以查看或者分析生成的 App Bundle
这个 Android App Bundle 无法上传到 Play Console,因为它未被签名。想要生成签名版本的话,请选择Build > Generate Signed Bundle/APK… > Android App Bundle > Select Base Module > Enter Signing Credentials & Check any other options (和您操作 APK 所做的事情一样)。
您也可以通过命令行使用 Gradle 的打包任务生成相同的 Android App Bundle。要生成已签名的应用束,就必须在模块的 build.gradle 文件中配置签名信息。
想要更好地控制从 Android App Bundle 进行拆分的方式的话,您可以从应用束的设置区块中进行精确设置:
方便强大的 bundletool
Bundletool 是一个用于处理 Android App Bundle 的命令行工具。使用 bundletool,您可以构建 Android App Bundle,提取连接的设备配置,生成 APK Set 文件 (.apks),从 APK Set 文件中提取或安装 APK,以及验证应用束。由于 Android App Bundle 仅是一种发布格式,因此 bundletool 用于生成和测试 APK。Google Play 和 IDE 使用的也是相同的工具,而且它是开源的。
>> Bundletool 的 GitHub 地址:
https://github.com/google/bundletool
使用 bundletool
这是 bundletool 接受的所有命令:build-bundle,build-apks,extract-apks,get-device-spec,install-apks,validate 和 version。使用 bundletool help <command> 获取有关命令的详细信息,例如标识符和其他选项。
在以下示例中,我们将找到已连接设备的配置,构建 APK,并为连接的设备安装 APK。
动态功能模块
动态功能模块让您可以将特定的功能移动到单独的模块中。我们使用了动态交付技术,根据需要向用户提供这些功能。动态功能模块需要您的仔细考量,以及付出一些工作量进行实际的拆分。
>> 有关创建和配置动态功能模块的详细文档:
https://developer.android.google.cn/guide/app-bundle/configure#dynamic_feature_modules
上传到 Play Store
拥有已签名的 Android App Bundle 后,您可以将其上传到 Play Store,让 Google Play 动态地为您的用户提供优化后的 APK。您还需要开通使用 Google Play 进行应用签名的功能,这样才能上传应用束。
使用 Google Play 进行应用签名提供了一种管理应用签名密钥的安全方式。Google Play 会管理您的应用签名密钥,您只使用上传密钥,用于验证您的身份。自己管理应用签名密钥存在风险,因为在丢失密钥后,您将无法更新已发布的应用; 同样,您的密钥很容易被盗。将签名过程委派给 Google Play 可以让您的密钥更加安全,您还可以请求重置上传密钥。所以,您永远不必担心被自己的应用拒之门外。开通应用签名后,Google Play 会自动生成并签署发送给用户设备的 APK。
上传后,单击应用束并选择 Explore App Bundle 即可查询节省空间的大小。在这里,您可以搜索和下载针对特定设备的 APK。对于列出的配置,您可以选择 VIEW DEVICES 以查看将获得该特定 APK 的设备列表。
好消息是,Android App Bundle 可以通过 Publishing API 发布。
小结
正如我们所见,Android App Bundle 代表着 Android 应用交付的未来,提供单一的 APK 的做法已经过时。应用体积可以减小,而且还可以提供定制功能,为每个用户提供度身定制的体验。
更棒的是,开发者并不需要花费太大力气就可以尽享这些收益。一些开发者已经发现应用体积大幅减少。用户也可以获得极大的好处,因为他们的设备可以为音乐、电影、应用等其他内容提供更多的可用空间。开发者还可以通过使用 Android Vitals 进一步提高其应用在用户设备上的性能和稳定性。
"我们期待着您用更小的文件体积,为用户带来优良的、个性化的体验,并因此促进您的应用获得更多的安装和更大的成功。"
推荐阅读:
· 借助 Google 的平台接触全球用户,用 Android Go 培养粉丝
· 离线设计: 让您的应用真正做到随时可用
· Android vitals 帮您解决应用质量问题 (下篇)